package org.KeyCrafter.ds.skiplist;

import java.util.Iterator;

public interface SkipList {

    // 定义常量
    // redis初始的最大高度为64
    int ZSKIPLIST_MAXLEVEL = 64;
    double ZSKIPLIST_P = 0.25;

    /**
     * 跳表节点
     * score表示用于存储排序的分值
     */
    interface Node{
        double getScore();
        Object getObject();
    }

    // 将包含给定成员和分值的新节点添加到跳跃表种
    Node insert(double score, Object obj);
    // 返回包含给定成员和分值的节点在跳跃表中的排位
    long getRank(double score, Object obj);
    // 删除跳跃表中包含给定成员和分值的点
    int delete(double score, Object obj);
    // 返回跳表在给定排位上的节点
    Node getElementByRank(long rank);
    // 给定一个分值范围 (range), 如果跳表中至少有一个节点在这个范围之内
    // 返回true，否则返回false
    boolean isInRange(RangeSpec range);
    // 给定一个分值范围，返回跳表中第一个符合这个范围的节点
    Node firstInRange(RangeSpec range);
    // 给定一个分值范围，返回跳表最后一个符合这个范围的节点
    Node lastInRange(RangeSpec range);
    // 给定一个分值范围，删除跳表中所有在这个范围内的节点，返回删除结点数量
    long deleteRangeByScore(RangeSpec range);
    // 给定一个排位范围，删除跳表中所有在这个范围内的接待你，返回删除节点数量
    long deleteRangeByRank(int start, int end);
    // 元素数量
    long length();
    // 返回迭代器
    // revers 为 false 从头向尾遍历，revers 为 true，从尾相头遍历
    Iterator<Node> iterator(boolean revers);
    // 获得以 rank 为起点，根据 revers 向前或向后遍历的迭代器
    Iterator<Node> getIteratorByRank(long rank,boolean revers);
}
